package com.zjsru.plan2023.oneday.oneDay202301;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: CookLee
 * @Date: 2023/1/11
 * 判断一个数的数字计数是否等于数位的值
 *
 * 输入：num = "1210"
 * 输出：true
 * 解释：
 * num[0] = '1' 。数字 0 在 num 中出现了一次。
 * num[1] = '2' 。数字 1 在 num 中出现了两次。
 * num[2] = '1' 。数字 2 在 num 中出现了一次。
 * num[3] = '0' 。数字 3 在 num 中出现了零次。
 * "1210" 满足题目要求条件，所以返回 true 。
 *
 * 输入：num = "030"
 * 输出：false
 * 解释：
 * num[0] = '0' 。数字 0 应该出现 0 次，但是在 num 中出现了两次。
 * num[1] = '3' 。数字 1 应该出现 3 次，但是在 num 中出现了零次。
 * num[2] = '0' 。数字 2 在 num 中出现了 0 次。
 * 下标 0 和 1 都违反了题目要求，所以返回 false 。
 *
 */
public class DigitCount {
    
    /**
     * 数字计算：哈希map
     *
     * @param num 字符串
     * @return boolean
     */
    public boolean digitCount(String num) {
        //使用map结构存储num字符串中已存在数据
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        int len = num.length();
        for (int i = 0; i < len; i++) {
            Integer c = num.charAt(i) - '0';
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        int cnt = 0;
        StringBuilder sb = new StringBuilder();
        //按照数字从小到大开始拼接，如果数字没有存入map则拼接0
        for (int i = 0; i < len; i++) {
            cnt = map.get(i) != null ? map.get(i) : 0;
            sb.append(cnt);
        }
        return sb.toString().equals(num);
    }
    
    /**
     * 数字计算：哈希map
     *
     * @param num 字符串
     * @return boolean
     */
    public boolean digitCount2(String num) {
        Map<Integer, Integer> h = new HashMap<Integer, Integer>();
        int n = num.length();
        for (int i = 0; i < n; i++) {
            int digit = num.charAt(i) - '0';
            h.put(digit, h.getOrDefault(digit, 0) + 1);
        }
        //对于当前数字位数和map中存入的次数不同时则返回false
        for (int i = 0; i < n; i++) {
            int v = num.charAt(i) - '0';
            if (h.getOrDefault(i, 0) != v) {
                return false;
            }
        }
        return true;
    }
    
    
    public static void main(String[] args) {
        DigitCount digitCount = new DigitCount();
        String num = "1210";
        System.out.println(digitCount.digitCount(num));
    }
}
